package 排序.utils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @description:
 * @author: ywk
 * @date: 2020-06-14
 */
public class BucketSort {
    public static void main(String[] args) {
        Integer[] A = {1, 4, 3, 4, 5, 2, 1};
        System.out.println(bucketSort(Arrays.asList(A), 10));
    }


    /**
     * 桶排序
     *
     * @param array
     * @param bucketSize
     * @return
     */
    public static List<Integer> bucketSort(List<Integer> array, int bucketSize) {
        if (array == null || array.size() < 2)
            return array;
        int max = array.get(0), min = array.get(0);
        // 找到最大值最小值
        for (int i = 0; i < array.size(); i++) {
            if (array.get(i) > max)
                max = array.get(i);
            if (array.get(i) < min)
                min = array.get(i);
        }
        int bucketCount = (max - min) / bucketSize + 1;
        ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketCount);
        ArrayList<Integer> resultArr = new ArrayList<>();
        for (int i = 0; i < bucketCount; i++) {
            bucketArr.add(new ArrayList<>());
        }
        for (int i = 0; i < array.size(); i++) {
            bucketArr.get((array.get(i) - min) / bucketSize).add(array.get(i));
        }
        //每个桶做排序
        if (bucketSize == 1) {
            for (int i = 0; i < bucketCount; i++) {
                for (int j = 0; j < bucketArr.get(i).size(); j++) {
                    resultArr.add(bucketArr.get(i).get(j));
                }
            }
        } else {
            if (bucketCount == 1) {
                bucketSize--;
            }
            for (int i = 0; i < bucketCount; i++) {
                List<Integer> temp = bucketSort(bucketArr.get(i), bucketSize);
                for (int j = 0; j < temp.size(); j++) {
                    resultArr.add(temp.get(j));
                }
            }
        }
        return resultArr;
    }
}
